import cv2

# 导入人脸级联分类器引擎
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
# 导入人眼级联分类器引擎
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')
# 导入微笑级联分类器引擎（原代码缺少此定义）
smile_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_smile.xml')

# 读取图片
img = cv2.imread('cxk.jpg')

# 确保图片已成功加载
if img is None:
    print("无法加载图片，请检查路径是否正确")
else:
    # 转换为灰度图，提高检测准确性
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # 人脸检测
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)

    # 遍历检测到的人脸
    for (x, y, w, h) in faces:
        # 绘制人脸框
        cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)

        # 人脸区域
        face_gray = gray[y:y + h, x:x + w]
        face_color = img[y:y + h, x:x + w]

        # 眼睛检测
        eyes = eye_cascade.detectMultiScale(face_gray)
        for (ex, ey, ew, eh) in eyes:
            # 绘制眼睛框
            cv2.rectangle(face_color, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 1)

        # 微笑检测
        smiles = smile_cascade.detectMultiScale(
            face_gray,
            scaleFactor=1.16,
            minNeighbors=65,
            minSize=(25, 25),
            flags=cv2.CASCADE_SCALE_IMAGE
        )
        for (sx, sy, sw, sh) in smiles:
            # 绘制微笑框
            cv2.rectangle(face_color, (sx, sy), (sx + sw, sy + sh), (0, 0, 255), 1)
            # 添加微笑文字标签
            cv2.putText(img, 'Smile', (x, y - 7), cv2.FONT_HERSHEY_SIMPLEX, 1.2, (0, 0, 255), 2, cv2.LINE_AA)

    # 显示结果
    cv2.imshow('Face Detection', img)

    # 等待按键并保存结果
    key = cv2.waitKey(0)
    cv2.destroyAllWindows()

    # 根据按键决定是否保存（按s键保存）
    if key == ord('s'):
        cv2.imwrite('cxk_output.jpg', img)
        print("图片已保存为 cxk_output.jpg")